
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.etrs.formathlon.vue.jsf.form.gest;

import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import net.etrs.formathlon.entity.formation.Domaine;
import net.etrs.formathlon.entity.formation.Formation;
import net.etrs.formathlon.entity.formation.SeanceTh;
import net.etrs.formathlon.entity.utilisateur.Personnel;
import net.etrs.formathlon.metier.utils.DateUtils;
import net.etrs.formathlon.persistance.formation.DomaineFacade;
import net.etrs.formathlon.persistance.formation.FormationFacade;
import net.etrs.formathlon.persistance.formation.SeanceThFacade;
import net.etrs.formathlon.persistance.utilisateur.PersonnelFacade;
import net.etrs.formathlon.vue.jsf.utils.CUDBean;
import org.primefaces.event.DateSelectEvent;
import org.primefaces.model.DualListModel;

/**
 * ManageBean JSF pour les pages traitant de l'administration des formations.
 * @author OPIF
 */
@ManagedBean
@ViewScoped
public class GestFormationBean extends CUDBean<Formation, FormationFacade> {

    @EJB
    private FormationFacade facade;
    // Utilisée pour connaitre la liste des domaines
    @EJB
    private DomaineFacade facadeDomaine;
    private List<Domaine> listDomaine;
    // Utilisée pour connaitre la liste des personnels
    @EJB
    private PersonnelFacade facadePersonnel;
    // Utilisée pour créer de nouvelles instances de séance théorique.
    @EJB
    private SeanceThFacade facadeSeance;
    // Composant PrimeFaces
    private DualListModel<Personnel> pickListInstructeur;
    private Domaine domaine;

    @PostConstruct
    @Override
    protected void init() {
        super.init();

        listDomaine = facadeDomaine.readAll();

        // initialisation des listes du composant PrimeFaces
        pickListInstructeur = new DualListModel<Personnel>();
        pickListInstructeur.setSource(facadePersonnel.readAll());
    }

    /**
     * Retourne la durée d'une formation. (cumul du nombre d'heures)
     */
    public int duree(Formation formation) {
        int duree = 0;
        for (SeanceTh seanceTh : formation.getListSeanceTh()) {
            duree += seanceTh.getNombre() * seanceTh.getDuree();
        }
        return duree;
    }

    /**
     * Retourne le nombre de séances d'une formation.
     */
    public int nombre(Formation formation) {
        int nombre = 0;
        for (SeanceTh seanceTh : formation.getListSeanceTh()) {
            nombre += seanceTh.getNombre();
        }
        return nombre;
    }

    @Override
    public boolean validerCreer() {
        //Met à jour la liste d'instructeurs de la formation
        getFormation().getListInstructeur().clear();
        for (Personnel instructeur : pickListInstructeur.getTarget()) {
            getFormation().getListInstructeur().add(instructeur);
        }
        boolean retour = super.validerCreer();
        getEntite().getDomaine().getListFormation().add(getEntite());
        facadeDomaine.update(getEntite().getDomaine());
        return retour;
    }

    @Override
    public boolean validerModifier() {
        //Met à jour la liste d'instructeurs de la formation
        getFormation().getListInstructeur().clear();
        for (Personnel instructeur : pickListInstructeur.getTarget()) {
            getFormation().getListInstructeur().add(instructeur);
        }
        if (!domaine.equals(getEntite().getDomaine())) {
            domaine.getListFormation().remove(getEntite());
            getEntite().getDomaine().getListFormation().add(getEntite());
            facadeDomaine.update(getEntite().getDomaine());
            facadeDomaine.update(domaine);
        }
        return super.validerModifier();
    }

    @Override
    public void annuler() {
        init();
    }

    @Override
    public void creer() {
        super.creer();
        ajouterSeance();

        // Initialisation du composant PrimeFaces pour une nouvelle saisie.
        pickListInstructeur.setSource(facadePersonnel.readAll());
        pickListInstructeur.getTarget().clear();
    }

    @Override
    public void modifier(Formation formation) {
        super.modifier(formation);
        domaine = formation.getDomaine();
        // Initialisation du composant PrimeFaces pour une modification.
        pickListInstructeur.setSource(facadePersonnel.readAll());
        pickListInstructeur.getTarget().clear();
        for (Personnel instructeur : formation.getListInstructeur()) {
            pickListInstructeur.getSource().remove(instructeur);
            pickListInstructeur.getTarget().add(instructeur);
        }
    }

    /**
     * Vérification de cohérence des dates.
     * @param event 
     */
    public void verifDateDebut(DateSelectEvent event) {
        try {
            DateUtils.verifOrdre(event.getDate(), getFormation().getDateFin());
        } catch (Exception ex) {
            displayAlert(ex.getMessage());
        }
    }

    /**
     * Vérification de cohérence des dates.
     * @param event 
     */
    public void verifDateFin(DateSelectEvent event) {
        try {
            DateUtils.verifOrdre(getFormation().getDateDebut(), event.getDate());
        } catch (Exception ex) {
            displayAlert(ex.getMessage());
        }
    }

    /**
     * Supprime une séance théorique de la formation.
     * @param seance 
     */
    public void supprimerSeance(SeanceTh seance) {
        getFormation().getListSeanceTh().remove(seance);
    }

    /**
     * Ajoute une séance théorique à la formation.
     */
    public void ajouterSeance() {
        getFormation().getListSeanceTh().add(facadeSeance.newInstance());
    }

    /**
     * @return the formation
     */
    public Formation getFormation() {
        return getEntite();
    }

    /**
     * @param formation the formation to set
     */
    public void setFormation(Formation formation) {
        setEntite(formation);
    }

    /**
     * @return the listDomaine
     */
    public List<Domaine> getListDomaine() {
        return listDomaine;
    }

    /**
     * @return the listFormation
     */
    public List<Formation> getListFormation() {
        return getListEntite();
    }

    /**
     * @param listFormation the listFormation to set
     */
    public void setListFormation(List<Formation> listFormation) {
        setListEntite(listFormation);
    }

    /**
     * @return the listInstructeur
     */
    public DualListModel<Personnel> getPickListInstructeur() {
        return pickListInstructeur;
    }

    /**
     * @param pickListInstructeur the listInstructeur to set
     */
    public void setPickListInstructeur(DualListModel<Personnel> pickListInstructeur) {
        this.pickListInstructeur = pickListInstructeur;
    }

    @Override
    protected FormationFacade getFacade() {
        return facade;
    }

    public boolean seanceSupprimable() {
        if (getFormation().getListSeanceTh().size() > 1) {
            return true;
        }
        return false;
    }
}
